///////////////////////////////////////////////////////////////////////////////
// File:        SqlDatabase.inl
// Author:      671643387@qq.com
// Description: 
///////////////////////////////////////////////////////////////////////////////

template<typename T>
SqlDatabase<T>::SqlDatabase(void)
    : myconn_(new T())
{

}

template<typename T>
SqlDatabase<T>::~SqlDatabase(void)
{

}

///////////////////////////////////////////////////////////////////////////////
template<typename T>
bool SqlDatabase<T>::Initialize(const std::string& info)
{
    assert(myconn_);
    return myconn_->Open(info);
}

template<typename T>
void SqlDatabase<T>::Close(void)
{
    if (myconn_)
    {
        myconn_->Close();
        myconn_.reset();
    }
}

///////////////////////////////////////////////////////////////////////////////
template<typename T>
void SqlDatabase<T>::EscapeString(std::string& s)
{
    assert(myconn_);
}

///////////////////////////////////////////////////////////////////////////
template<typename T>
SqlResultSetPtr SqlDatabase<T>::PQuery(std::string sql, ...)
{
    char lsql[MAX_QUERY_LEN];
    std::va_list varg;
    va_start(varg, sql);
    int ret = vsnprintf(lsql, MAX_QUERY_LEN, sql.c_str(), varg);
    va_end(varg);
    if (ret == -1)
    {
        ERROR_LOG("SQL Query truncated (and not execute) for format: %s", sql.c_str());
        return SqlResultSetPtr();
    }
    return myconn_->Query(lsql);
}

template<typename T>
bool SqlDatabase<T>::PExecute(std::string sql, ...)
{
    char lsql[MAX_QUERY_LEN];
    std::va_list varg;
    va_start(varg, sql);
    int ret = vsnprintf(lsql, MAX_QUERY_LEN, sql.c_str(), varg);
    va_end(varg);
    if (ret == -1)
    {
        ERROR_LOG("SQL Query truncated (and not execute) for format: %s", sql.c_str());
        return false;
    }
    return myconn_->Execute(lsql);
}